﻿/*
 * EmeCoder v1.2.1.168
 * 作者：Administrator/PC4APPLE
 * 时间：2014-11-08 03:15:02
 * 版权：版权所有 (C) Eme Development Team 2014
*/

﻿using System;
using System.ComponentModel;
using CuteAnt.OrmLite;

// 测试数据库：http://pan.baidu.com/s/1bn8fPX9
//             下载完毕，解压到执行目录 Data目录下

namespace XiaoMIDataTran
{
	/// <summary>小米</summary>
	[Serializable]
	[ModelCheckMode(ModelCheckModes.CheckTableWhenFirstUse)]
	public class xiaomi : xiaomi<xiaomi> { }

	/// <summary>小米</summary>
	public partial class xiaomi<TEntity> : Entity<TEntity> where TEntity : xiaomi<TEntity>, new()
	{
		#region 对象操作﻿

		static xiaomi()
		{
			// 用于引发基类的静态构造函数，所有层次的泛型实体类都应该有一个
			TEntity entity = new TEntity();

			if (!Meta.Session.SingleCacheDisabled)
			{
				var singleCache = Meta.SingleCache;

				//singleCache.GetKeyMethod = e => e.ID;
				//singleCache.FindKeyMethod = key =>
				//{
				//    var session = Meta.Session;
				//    if (session.EntityCacheDisabled)
				//    {
				//        return Find(__.ID, key);
				//    }
				//    else
				//    {
				//        var id = Convert.ToInt32(key);
				//        return id > 0 ? session.Cache.Entities.Find(e => id == e.ID) : null;
				//    }
				//};

				//singleCache.InitializeMethod = () =>
				//{
				//    var session = Meta.Session;
				//    var sc = session.SingleCache;
				//    if (session.EntityCacheDisabled)
				//    {
				//        ProcessAllWithLockToken(list =>
				//        {
				//            foreach (var item in list)
				//            {
				//                sc.Add(item.ID, item);
				//            }
				//        }, ActionLockTokenType.None, 500, sc.MaxCount);
				//    }
				//    else
				//    {
				//        var list = session.Cache.Entities;
				//        foreach (var item in list)
				//        {
				//            sc.Add(item.ID, item);
				//        }
				//    }
				//};
			}
		}

		///// <summary>首次连接数据库时初始化数据，仅用于实体类重载，用户不应该调用该方法</summary>
		//[EditorBrowsable(EditorBrowsableState.Never)]
		//protected override void InitData()
		//{
		//    base.InitData();

		//    // InitData一般用于当数据表没有数据时添加一些默认数据，该实体类的任何第一次数据库操作都会触发该方法，默认异步调用
		//    // Meta.Count是快速取得表记录数
		//    if (Meta.Count > 0) return;

		//    // 需要注意的是，如果该方法调用了其它实体类的首次数据库操作，目标实体类的数据初始化将会在同一个线程完成
		//    HmTrace.WriteDebug("开始初始化{0}[{1}]数据……", typeof(TEntity).Name, Meta.Table.DataTable.DisplayName);

		//    var entity = new xiaomi();
		//    entity.username = "abc";
		//    entity.password = "abc";
		//    entity.email = "abc";
		//    entity.ip = "abc";
		//    entity.Insert();

		//    HmTrace.WriteDebug("完成初始化{0}[{1}]数据！", typeof(TEntity).Name, Meta.Table.DataTable.DisplayName);
		//}

		///// <summary>已重载。保存实体，根据主键检查数据库中是否已存在该对象，再决定调用Insert或Update</summary>
		///// <returns></returns>
		//public override Int32 Save()
		//{
		//    if (EntityHelper.IsORMRemoting) { return base.Save(); }
		//
		//    #region 业务代码
		//    #endregion
		//
		//    return base.Save();
		//}

		///// <summary>已重载。基类先调用Valid(true)验证数据，然后在事务保护内调用OnInsert</summary>
		///// <returns></returns>
		//public override Int32 Insert()
		//{
		//    if (EntityHelper.IsORMRemoting) { return base.Insert(); }
		//
		//    #region 业务代码
		//    #endregion
		//
		//    return base.Insert();
		//}

		///// <summary>已重载。在事务保护范围内处理业务，位于Valid之后</summary>
		///// <returns></returns>
		//protected override Int32 OnInsert()
		//{
		//    if (EntityHelper.IsORMRemoting) { return base.OnInsert(); }
		//
		//    #region 业务代码
		//    #endregion
		//
		//    return base.OnInsert();
		//}

		#endregion

		#region 扩展查询﻿

		/// <summary>根据主键查找</summary>
		/// <param name="id">主键</param>
		/// <returns></returns>
		[DataObjectMethod(DataObjectMethodType.Select, false)]
		public static TEntity FindByID(Int32 id)
		{
			var session = Meta.Session;
			if (session.EntityCacheDisabled)
				return Find(__.ID, id);
			else // 实体缓存
				return session.Cache.Entities.Find(__.ID, id);
			// 单对象缓存
			//return Meta.SingleCache[id];
		}

		#endregion

		#region 高级查询

		// 以下为自定义高级查询的例子

		///// <summary>
		///// 查询满足条件的记录集，分页、排序
		///// </summary>
		///// <param name="key">关键字</param>
		///// <param name="orderClause">排序，不带Order By</param>
		///// <param name="startRowIndex">开始行，0表示第一行</param>
		///// <param name="maximumRows">最大返回行数，0表示所有行</param>
		///// <returns>实体集</returns>
		//[DataObjectMethod(DataObjectMethodType.Select, true)]
		//public static EntityList<TEntity> Search(String key, String orderClause, Int32 startRowIndex, Int32 maximumRows)
		//{
		//    return FindAll(SearchWhere(key), orderClause, null, startRowIndex, maximumRows);
		//}

		///// <summary>
		///// 查询满足条件的记录总数，分页和排序无效，带参数是因为ObjectDataSource要求它跟Search统一
		///// </summary>
		///// <param name="key">关键字</param>
		///// <param name="orderClause">排序，不带Order By</param>
		///// <param name="startRowIndex">开始行，0表示第一行</param>
		///// <param name="maximumRows">最大返回行数，0表示所有行</param>
		///// <returns>记录数</returns>
		//public static Int32 SearchCount(String key, String orderClause, Int32 startRowIndex, Int32 maximumRows)
		//{
		//    return FindCount(SearchWhere(key), null, null, 0, 0);
		//}

		/// <summary>构造搜索条件</summary>
		/// <param name="key">关键字</param>
		/// <returns></returns>
		private static String SearchWhere(String key)
		{
			// WhereExpression重载&和|运算符，作为And和Or的替代
			// SearchWhereByKeys系列方法用于构建针对字符串字段的模糊搜索
			var exp = SearchWhereByKeys(key, null);

			// 以下仅为演示，Field（继承自FieldItem）重载了==、!=、>、<、>=、<=等运算符（第4行）
			//if (userid > 0) exp &= _.OperatorID == userid;
			//if (isSign != null) exp &= _.IsSign == isSign.Value;
			//if (start > DateTime.MinValue) exp &= _.OccurTime >= start;
			//if (end > DateTime.MinValue) exp &= _.OccurTime < end.AddDays(1).Date;

			return exp;
		}

		#endregion
	}
}